package com.luxsoft.siipap.em.replica.importadores.inventarios;

import java.util.Date;
import java.util.Map;

import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;
import org.springframework.dao.DataIntegrityViolationException;

import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFReaderTemplate;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFRowHandler;
import com.luxsoft.siipap.inventarios.model.Inventario;
import com.luxsoft.siipap.inventarios.model.MovimientoDet;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;
import com.luxsoft.siipap.util.DateUtil;

/**
 * Permite importar TPE y TPS de Siipap actualiza las existencias
 * 
 * @author Ruben Cancino
 *
 */
public class ImportadorDeTPE_TPS implements DBFRowHandler{
	
	private ImportadorSupport support;
	
	private Logger logger=Logger.getLogger(getClass());
	private DBFReaderTemplate template;
	private Date fecha;
	
	
	
	public ImportadorDeTPE_TPS(){
		template=new DBFReaderTemplate();
		template.setTabla("ALMACE");
		support=ImportadorSupport.getInstance();
		
	}
	
	int sucursalClave;
	
	public void importar(Date fecha,int sucursalClave){
		logger.info("Importando traslados para:"+fecha+ " Sucursal: "+sucursalClave);
		this.fecha=fecha;
		this.sucursalClave=sucursalClave;
		template.execute(new Periodo(fecha),this,true);
		
	}
	
	

	public void processRow(Map<String, Object> row) throws Exception {
		String tipo=(String)row.get("ALMTIPO");
		int sucursal=getSafaInt(row, "ALMSUCUR");
		
		if(
				(tipo.equals("TPE")) || 
				(tipo.equals("TPS")) 
				){
			Date fechaMov=(Date)row.get("ALMFECHA");
			if(sucursal==sucursalClave){
				final Sucursal suc=support.buscarSucursal(sucursal);
				System.out.println(tipo + " Fecha: "+DateUtil.getDate(fechaMov)+ "  Sucursal: "+sucursal);
				if(DateUtils.isSameDay(fecha, fechaMov)){
					MovimientoDet sal=new MovimientoDet();
					sal.setConcepto(tipo);
					sal.setDocumento(getSafaLong(row, "ALMNUMER"));
					sal.setCantidad(getSafaLong(row, "ALMCANTI"));
					sal.setClave(row.get("ALMARTIC").toString());
					String comentario=(String)row.get("ALMOBSER");
					sal.setComentario(comentario);		
					sal.setFecha((Date)row.get("ALMFECHA"));
					sal.setRenglon(getSafaInt(row, "ALMRENGL"));
					sal.setProducto(support.buscarProducto(sal.getClave().trim()));					
					sal.setSucursal(suc);
							
					try {
						//sal=(MovimientoDet)ServiceLocator2.getUniversalDao().save(sal);
						persistir(sal);
						try {
							int year=Periodo.obtenerYear(sal.getFecha());
							int mes=Periodo.obtenerMes(sal.getFecha())+1;
							ServiceLocator2.getExistenciaDao()						
							.actualizarExistencias(sal.getClave(),year,mes);
						} catch (Exception e) {
							logger.error("Error actualizando existencia para : "+sal.getClave());
						}
						
					} catch (DataIntegrityViolationException de) {
						logger.info("Movimiento existente: "+row+ "\n"+de.getRootCause().getMessage());
					}
				}
			}
			
			/*
			if(DateUtils.isSameDay(fecha, fechaMov)){
				MovimientoDet sal=new MovimientoDet();
				sal.setConcepto(tipo);
				sal.setDocumento(getSafaLong(row, "ALMNUMER"));
				sal.setCantidad(getSafaLong(row, "ALMCANTI"));
				sal.setClave(row.get("ALMARTIC").toString());
				String comentario=(String)row.get("ALMOBSER");
				sal.setComentario(comentario);		
				sal.setFecha((Date)row.get("ALMFECHA"));
				sal.setRenglon(getSafaInt(row, "ALMRENGL"));
				sal.setProducto(support.buscarProducto(sal.getClave().trim()));
				
				sal.setSucursal(support.buscarSucursal(getSafaInt(row, "ALMSUCUR")));
						
				try {
					//sal=(MovimientoDet)ServiceLocator2.getUniversalDao().save(sal);
					persistir(sal);
					try {
						int year=Periodo.obtenerYear(sal.getFecha());
						int mes=Periodo.obtenerMes(sal.getFecha())+1;
						ServiceLocator2.getExistenciaDao()						
						.actualizarExistencias(sal.getClave(),year,mes);
					} catch (Exception e) {
						logger.error("Error actualizando existencia para : "+sal.getClave());
					}
					
				} catch (DataIntegrityViolationException de) {
					logger.info("Movimiento existente: "+row+ "\n"+de.getRootCause().getMessage());
				}
			}*/
			
		}
		
	}
	
	public void persistir(Inventario inv){
		//System.out.println("Persistiendo: "+inv);
		ServiceLocator2.getUniversalDao().save(inv);
	}
	
	public int contar(final Periodo p){
		return 0;
	}
	
	public double getSafaDouble(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.doubleValue():0;
	}
	
	public long getSafaLong(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.longValue():0;
	}
	
	public int getSafaInt(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.intValue():0;
	}
	
	public static void main(String[] args) {
		DBUtils.whereWeAre();
		ImportadorDeTPE_TPS importador=new ImportadorDeTPE_TPS();
		importador.importar(DateUtil.toDate("03/02/2010"),5);
		
	}
}
